package com.and.video.service.util;

import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

/**
 * MD5加密
 * 单向加密算法
 * 特点：加密速度快，不需要秘钥，但是安全性不高，需要搭配随机盐值使用
 *
 */
public class MD5Util {

	public static String sign(String content, String salt, String charset) {
		content = content + salt;
		return DigestUtils.md5Hex(getContentBytes(content, charset));
	}

	public static boolean verify(String content, String sign, String salt, String charset) {
		content = content + salt;
		String mysign = DigestUtils.md5Hex(getContentBytes(content, charset));
		return mysign.equals(sign);
	}

	private static byte[] getContentBytes(String content, String charset) {
		if (!"".equals(charset)) {
			try {
				return content.getBytes(charset);
			} catch (UnsupportedEncodingException var3) {
				throw new RuntimeException("MD5签名过程中出现错误,指定的编码集错误");
			}
		} else {
			return content.getBytes();
		}
	}


	/**
	 * 计算上传文件的MD5哈希值
	 */
	public static String getFileMD5(MultipartFile file) throws Exception {
		// 获取上传文件的输入流，用于读取文件内容
		InputStream fis = file.getInputStream();

		// 创建字节数组输出流，用于临时存储文件内容
		ByteArrayOutputStream baos = new ByteArrayOutputStream();

		// 创建缓冲区，每次读取1024字节
		byte[] buffer = new byte[1024];

		// 记录每次实际读取的字节数
		int byteRead;

		// 循环读取文件内容，直到读完所有数据
		while((byteRead = fis.read(buffer)) > 0){
			// 将读取的数据写入字节数组输出流
			baos.write(buffer, 0, byteRead);
		}

		// 关闭输入流
		fis.close();

		// 计算字节数组的MD5哈希值并返回十六进制字符串
		return DigestUtils.md5Hex(baos.toByteArray());
	}
}